package cn.jcby.app.lebu.service.impl;

import cn.jcby.app.excpt.enums.ExceptionMsgEnum;
import cn.jcby.app.lebu.controller.req.BasicListReq;
import cn.jcby.app.lebu.controller.res.MessageListRes;
import cn.jcby.app.lebu.dao.UserMessageDao;
import cn.jcby.app.lebu.entity.UserMessageEntity;
import cn.jcby.app.lebu.enums.MessageTypeEnum;
import cn.jcby.app.lebu.service.UserMessageService;
import cn.jcby.app.lebu.utils.PageUtils;
import cn.jcby.app.lebu.utils.UserInfoUtil;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Assert;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;

import java.math.BigDecimal;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

@Service("userMessageService")
public class UserMessageServiceImpl extends ServiceImpl<UserMessageDao, UserMessageEntity> implements UserMessageService {

    @Override
    public PageUtils queryPage(BasicListReq params) {
        IPage<MessageListRes> retPage = new Page<>(params.getPage(), params.getLimit()) ;
        List<MessageListRes> retList = new ArrayList<>() ;
        IPage<UserMessageEntity> page = this.page(
                new Page<>(params.getPage(),params.getLimit()),
                Wrappers.<UserMessageEntity>lambdaQuery()
                        .eq(UserMessageEntity::getReceiverUserId, UserInfoUtil.getUserId())
                        .eq(UserMessageEntity::getDel,0)
        );
        if (CollectionUtils.isNotEmpty(page.getRecords())){
            page.getRecords().stream().forEach(userMessageEntity -> {
                MessageListRes messageListRes = new MessageListRes() ;
                BeanUtils.copyProperties(userMessageEntity, messageListRes);
                messageListRes.setMessageTypeDesc(MessageTypeEnum.getDesc(userMessageEntity.getMessageType())) ;
                retList.add(messageListRes) ;
            }) ;
        }

        retPage.setRecords(retList) ;
        retPage.setTotal(page.getTotal()) ;
        retPage.setPages(page.getPages()) ;
        return new PageUtils(retPage);
    }
    @Override
    public void add(UserMessageEntity userMessageReq){
        UserMessageEntity userMessage = new UserMessageEntity() ;
        save(userMessage) ;
    }

    @Override
    public void updateBy(UserMessageEntity userMessageReq){
        UserMessageEntity userMessage = new UserMessageEntity() ;
        updateById(userMessage) ;
    }

    @Override
    public void read(Long id) {
        UserMessageEntity one = getOne(Wrappers.<UserMessageEntity>lambdaQuery().eq(UserMessageEntity::getId, id).eq(UserMessageEntity::getReceiverUserId, UserInfoUtil.getUserId()));
        Assert.isFalse(one == null, ExceptionMsgEnum.RECORD_NOT_EXIST.getCode()+"");
        one.setReadStatus(1);
        updateById(one);
    }

    @Override
    public void addRecord(String senderUserId,String receiverUserid, MessageTypeEnum inviteTaPublish, BigDecimal... args) {
        UserMessageEntity userMessage = new UserMessageEntity() ;
        userMessage.setSenderUserId(senderUserId);
        userMessage.setReceiverUserId(receiverUserid);
        userMessage.setMessageType(inviteTaPublish.getCode());
        String message = inviteTaPublish.getMessage();
        if (args != null && args.length > 0){
            message = MessageFormat.format(inviteTaPublish.getMessage(), args);
        }
        userMessage.setMessage(message);
        userMessage.setCreateTime(new Date());
        userMessage.setReadStatus(0);
        userMessage.setDel(0);
        userMessage.setUpdateTime(new Date());
        save(userMessage) ;
    }

}